// 持久化：1：值修改了存储到浏览器  2：初始值读取浏览器存储
// import { setToken, getToken } from '@/utils/auth'
import { sysLogin } from '@/api/login'
import { sysProfile, sysUser } from '@/api/user'
import { powerRoutes, constantRoutes, resetRouter } from '@/router'
import router from '@/router'
export default {
  namespaced: true,
  state: {
    // token: getToken()
    token: '',
    userInfo: {}
  },
  mutations: {
    setUserToken(state, value) {
      state.token = value
      // 存储token到cookie
      // setToken(value)
    },
    // 修改userInfo
    setUserInfo(state, value) {
      state.userInfo = value
    },
    // 删除用户信息与token
    logout(state) {
      state.token = ''
      state.userInfo = ''
      // 重置路由
      resetRouter()
    }
  },
  actions: {
    // 调用登录api
    async toLogin({ commit }, value) {
      // ctx:{state,commit}
      const res = await sysLogin(value)
      commit('setUserToken', res.data)
      // console.log(3)
      // console.log(res)
    },
    // 获取用户信息
    async getUserInfo({ commit }) {
      const res = await sysProfile()
      const res2 = await sysUser(res.data.userId)
      // console.log('res2', res2)
      // 合并对象 a= {a:1}  b={b:2,a:2}    {...a,...b}
      // 合并后的对象=Object.assign({},对象a,对象b)
      // 存储用户信息
      const res3 = Object.assign({}, res.data, res2.data)
      commit('setUserInfo', res3)
      // 动态路由（需要权限处理的路由）筛选
      // 动态路由数据   powerRoutes
      // 权限标识数据:res3.roles.menus
      const newArr = powerRoutes.filter((item) => {
        // 看权限标识 是否包含当前code
        return res3.roles.menus.includes(item.meta.code)
      })
      newArr.push({ path: '*', redirect: '/404', hidden: true })
      // 添加
      router.addRoutes(newArr)
      // 手动更新菜单中的路由配制
      router.options.routes = [...constantRoutes, ...newArr]

      /*
1:将路由分成二块
    静态路由：默认只有静态路由（404,login,首页）
    动态路由
2:动态路由中加了标识  code,用于和权限数据做匹配
3：在获取用户信息后，通过用户信息中的权限数据与动态路由匹配，将匹配数据通过router.addRoutes添加到路由配制中
4：菜单使用this.$router.options.routes，它的数据并不会因为addRoutes而更新，需要手动更新
addRoutes添加的路由不能立马使用，需要再经过一次导航守卫就可正常
   解决方案：
      导航守卫中使用  next(to)再经过一次导航守卫
      404它会匹配：将404通过addRoutes添加
*/
    }
  },
  getters: {}
}
